import json
import re
from datetime import datetime, timedelta
from openai import OpenAI
from app.services import CONFIG_FILE


def detect_language(text) -> str:
    """
    检测语言，返回 'zh'（中文）或 'en'（英文）
    :param text: 输入文本
    :return:
    """
    prompt = f"检测这句话的语言: '{text}'，只返回 'zh' 或 'en'"
    lang = get_ai_response(prompt,lang='zh')  # 调用 OpenAI API
    return "zh" if "zh" in lang.lower() else "en"


def detect_intent(message) -> str:
    """
    判断用户是普通聊天还是日程创建
    :param message: 输入文本
    :return:
    """
    prompt = f"判断以下文本的意图: '{message}'\n返回 'schedule' 或 'chat'"
    return "schedule" if "schedule" in get_ai_response(prompt,lang='zh') else "chat"


def extract_event_details(message, lang) -> dict:
    """
    提取日程信息
    :param message: 输入文本
    :param lang: 语言
    :return:
    """
    prompt = f"""
        从以下内容 '{message}' 提取事件信息，返回一个JSON格式的字典，包含以下字段：
        - '主题'：事件的名称或描述（如果没有请留空）
        - '开始时间'：事件的开始时间，支持如“明天下午三点”、“3:00 PM”等格式（如果没有请留空）。
          需要返回一个 Outlook 可接受的日期时间格式。
          如果没有年份信息，请使用当前年份。
        - '结束时间'：事件的结束时间，支持如“明天下午五点”、“6:00 PM”等格式（如果没有请留空）。
          需要返回一个 Outlook 可接受的日期时间格式。
          如果没有年份信息，请使用当前年份。
        - '地点'：事件的地点（如果没有请留空）。
        - 返回的 JSON 中没有任何多余的信息，只包含字段值，不带解释或其他文字


        请确保：
        1. 返回的 JSON 中字段为 '主题', '开始时间', '结束时间', '地点'。
        2. 如果某一字段无法提取，请将其留空或返回空字符串。
        3. 对于时间，返回 Outlook 可接受的日期时间格式（如 'YYYY-MM-DD HH:MM:SS'）。
        4. 如果没有年份信息，请使用2025年份。
        5. 返回的 JSON 中没有任何多余的信息，只包含字段值，不带解释或其他文字。
        6. 今天，明天，后天这些都是相对日期，都是从当前日期开始计算
        """

    try:
        event_data = get_ai_response(prompt,lang=lang)
        print(event_data)
        json_pattern =  r'(\{.*?\})'
        match = re.search(json_pattern, event_data, re.DOTALL)
        if match:
            json_str = match.group(1)
            try:
                data = json.loads(json_str)
                subject = data.get("主题", "")
                start_time = data.get("开始时间", "")
                end_time = data.get("结束时间", "")
                location = data.get("地点", "")
                missing_info = []

                if not subject:
                    missing_info.append("事件主题" if lang == "zh" else "Event subject")
                if not start_time:
                    missing_info.append("开始时间" if lang == "zh" else "Start time")
                if not location:
                    missing_info.append("行程地点" if lang == "zh" else "Event location")
                if missing_info:
                    generate_missing_info_message(missing_info)
                if not end_time:
                    try:
                        start_dt = datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")  # 解析时间
                        end_dt = start_dt + timedelta(hours=1)  # 默认增加 1 小时
                        end_time = end_dt
                    except Exception:
                        return {
                            "success": False,
                            "message": "无法解析时间格式，请提供正确的时间（例如 '3:00 PM'）" if lang == "zh" else
                            "Unable to parse the time format. Please provide a correct time (e.g., '3:00 PM')"
                        }
                return {
                    "success": True,
                    "Subject": subject,
                    "Start Time": start_time,
                    "End Time": end_time,
                    "Location": location
                }
            except json.JSONDecodeError:
                print("JSON 解析失败。")
        else:
            print("未找到 JSON 部分。")

    except Exception as e:
        return {
            "success": False,
            "message": f"解析失败，请重试或提供更清晰的信息 😊（错误: {str(e)}）" if lang == "zh" else
            f"Parsing failed. Please try again or provide clearer information 😊 (Error: {str(e)})"
        }


def generate_missing_info_message(missing_info, lang="zh") -> dict:
    """
    生成缺失信息的提示消息
    :param missing_info: 缺失字段的列表
    :param lang: 语言，默认为中文
    :return: 格式化的提示信息
    """
    if lang == "zh":
        return {
            "success": False,
            "message": f"请提供 {', '.join(missing_info)}，以便我能为您创建完整的日程 😊"
        }
    else:
        return {
            "success": False,
            "message": f"Please provide {', '.join(missing_info)} so I can create a complete schedule for you 😊"
        }


def get_openai_api_key() -> str:
    """
    获取OpenAI API密钥
    :return:
    """
    try:
        with open(CONFIG_FILE, "r") as f:
            config = json.load(f)
            return config.get("openai_api_key", "")
    except Exception as e:
        print(f"读取配置文件错误: {e}")
        return ""


def get_ai_response(message: str,lang) -> str:
    """
    使用OpenAI获取AI回复
    :param message:  输入文本
    :param lang: 语言
    :return:
    """
    try:
        api_key = get_openai_api_key()
        if not api_key:
            return "OpenAI API密钥未配置，请联系管理员。"

        # 创建OpenAI客户端
        client = OpenAI(api_key=api_key)
        if lang == 'zh':
            response = client.chat.completions.create(
                model="gpt-4",
                messages=[
                    {"role": "system", "content": "你是一个友好、专业的AI助手，名叫AI助手。"},
                    {"role": "user", "content": message}
                ],
                max_tokens=4000,
                temperature=0.7
            )
        elif lang == 'en':
            response = client.chat.completions.create(
                model="gpt-4",
                messages=[
                    {"role": "system", "content": "你是一个友好、专业的AI助手，名叫AI助手请用，英文跟我对话。"},
                    {"role": "user", "content": message}
                ],
                max_tokens=4000,
                temperature=0.7
            )
        else:
            return f"不支持的语言代码: {lang}"
        reply = response.choices[0].message.content
        return reply
    except Exception as e:
        print(f"获取AI回复错误: {e}")
        return f"抱歉，无法获取AI回复: {str(e)}"


if __name__ == '__main__':
    print(get_ai_response(message="检测这句话的语言: 'nihao'，只返回 'zh' 或 'en'", lang='zh'))